﻿#ifndef SCREENWIDGET_H
#define SCREENWIDGET_H

/**
 * 全局截屏控件
 * 1. 鼠标右键弹出菜单。
 * 2. 支持全局截屏。
 * 3. 支持局部截屏。
 * 4. 支持截图区域拖动。
 * 5. 支持图片另存为。
 */

#include <QWidget>
#include <QMenu>
#include <QPoint>
#include <QSize>
#include <QPointer>

// 截屏类用于处理截屏相关的操作
class Screen
{
public:
    // 状态枚举，包括选择区域、移动区域和设置宽高
    enum STATUS {SELECT, MOV, SET_W_H};

    Screen() {}
    Screen(QSize size);

    // 设置开始和结束的坐标点
    void setStart(QPoint pos);
    void setEnd(QPoint pos);
    QPoint getStart(); // 获取开始坐标
    QPoint getEnd();   // 获取结束坐标

    // 获取截图区域的左上角和右下角坐标
    QPoint getLeftUp();
    QPoint getRightDown();

    STATUS getStatus(); // 获取当前状态
    void setStatus(STATUS status); // 设置当前状态

    int width();  // 获取截图区域的宽度
    int height(); // 获取截图区域的高度

    // 检测坐标点是否在截图区域内
    bool isInArea(QPoint pos);
    // 按坐标移动截图区域
    void move(QPoint p);

private:
    QPoint leftUpPos, rightDownPos; // 截图区域的左上角和右下角
    QPoint startPos, endPos;         // 鼠标开始位置和结束位置
    int maxWidth, maxHeight;         // 屏幕的最大宽高
    STATUS status;                   // 当前状态

    // 比较两个位置，判断哪一个是左上角，哪一个是右下角
    void cmpPoint(QPoint &s, QPoint &e);
};

#ifdef quc
class Q_DECL_EXPORT ScreenWidget : public QWidget
#else
class ScreenWidget : public QWidget
#endif

{
    Q_OBJECT
public:
    static ScreenWidget *Instance(); // 单例模式获取实例
    explicit ScreenWidget(QWidget *parent = 0); // 构造函数
    ~ScreenWidget();

private:
    static QPointer<ScreenWidget> self; // 单例指针
    QMenu *menu;          // 右键菜单对象
    Screen *screen;       // 截屏对象
    QPixmap *fullScreen;  // 保存全屏图像
    QPixmap *bgScreen;    // 模糊背景图
    QPoint movPos;        // 鼠标位置

protected:
    void contextMenuEvent(QContextMenuEvent *); // 右键菜单事件
    void mousePressEvent(QMouseEvent *);        // 鼠标按下事件
    void mouseMoveEvent(QMouseEvent *);         // 鼠标移动事件
    void mouseReleaseEvent(QMouseEvent *);      // 鼠标释放事件
    void paintEvent(QPaintEvent *);             // 绘图事件
    void showEvent(QShowEvent *);               // 窗口显示事件
    void keyPressEvent(QKeyEvent* event) override; // 重写键盘事件
    void hideEvent(QHideEvent* event) override;    // 重写隐藏事件

private slots:
    void saveScreen();         // 保存当前截图
    void saveFullScreen();     // 保存全屏截图
    void saveScreenOther();    // 另存当前截图
    void saveFullOther();      // 另存全屏截图
};

#endif // SCREENWIDGET_H
